package com.nchu.student_score.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nchu.student_score.dataObject.PasswordCheck;
import com.nchu.student_score.mapper.AdminMapper;
import com.nchu.student_score.model.Admin;
import com.nchu.student_score.service.AdminService;
import com.nchu.student_score.util.Define;
import com.nchu.student_score.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.List;

@Service
public class AdminServiceImpl implements AdminService {
    @Autowired
    AdminMapper adminMapper;

    @Override
    public ResultVo<Admin> addOneAdmin(Admin input, String superAdminKey) {//新增管理员
        ResultVo<Admin> resultVo = new ResultVo<>();
        if(this.superAdminKeyCheck(superAdminKey)){
            Admin admin = adminMapper.selectByPrimaryKey(input.getAdminId());
            if(input.getAdminId() == 0 || admin != null){
                resultVo.setStatus(1);
                resultVo.setMessage("您不能新增该管理员编号!");
            }
            else{
                input = this.adminPwdInit(input);
                adminMapper.insert(input);
                resultVo.setStatus(0);
                resultVo.setMessage("新增管理员成功!");
            }
        }
        else{
            resultVo.setStatus(1);
            resultVo.setMessage("超级管理员身份校验未通过!");
        }
        return resultVo;
    }

    @Override
    public ResultVo<Admin> adminPwdInit(Admin input, String superAdminKey) {//重置密码
        ResultVo<Admin> resultVo = new ResultVo<>();
        if(this.superAdminKeyCheck(superAdminKey)){
            Admin admin = adminMapper.selectByPrimaryKey(input.getAdminId());
            if(admin == null){
                resultVo.setStatus(2);
                resultVo.setMessage("未获取到待重置密码的管理员信息!");
            }
            else{
                admin = this.adminPwdInit(admin);//重置密码
                adminMapper.updateByPrimaryKey(admin);
                resultVo.setStatus(0);
                resultVo.setMessage("密码重置成功!");
            }
        }
        else{
            resultVo.setStatus(1);
            resultVo.setMessage("超级管理员身份校验未通过!");
        }
        return resultVo;
    }

    @Override
    public ResultVo<Admin> updateOneAdmin(Admin input, String superAdminKey) {//修改管理员状态/名称
        ResultVo<Admin> resultVo = new ResultVo<>();
        if(this.superAdminKeyCheck(superAdminKey)){//超级管理员校验
            Admin updateAdmin = adminMapper.selectByPrimaryKey(input.getAdminId());
            if(updateAdmin == null){//未获取到待修改的管理员信息
                resultVo.setStatus(2);
                resultVo.setMessage("未获取到待修改的管理员信息");
            }
            else{
                //先判断是不是更改状态(状态通过密码长度决定,md5加密长度固定32位)
                if(input.getState() != null && input.getState().equals("enable")
                        && updateAdmin.getPassword().length() == 33){
                    updateAdmin.setPassword(updateAdmin.getPassword().substring(0,32));//启用则将密码长度-1
                }
                else if(input.getState() != null && input.getState().equals("disable")
                        && updateAdmin.getPassword().length() == 32){
                    updateAdmin.setPassword(updateAdmin.getPassword() + "0");//禁用则将密码长度+1
                }
                else{//不是修改状态则是修改名称
                    updateAdmin.setAdminName(input.getAdminName());
                }
                adminMapper.updateByPrimaryKey(updateAdmin);//更新管理员
                resultVo.setStatus(0);
                resultVo.setMessage("编辑管理员成功!");
            }
        }
        else{
            resultVo.setStatus(1);
            resultVo.setMessage("超级管理员身份校验未通过!");
        }
        return resultVo;
    }

    @Override
    public PageInfo<Admin> getAdminList(Admin admin,Integer currPage) {//获取管理员列表
        if(currPage == null) currPage = 1;
        PageHelper.startPage(currPage, Define.PAGE_SIZE);
        PageInfo<Admin> pageInfo;
        if(this.superAdminCheck(admin)){//校验超级管理员身份
            pageInfo = new PageInfo<>(adminMapper.selectAll());//该查询无法查出超级管理员本身
            List<Admin> adminList = pageInfo.getList();
            for(Admin a:adminList){//依次判断十分有效并添加状态
                if(a.getPassword().length() == 32)//根据密码长度判断用户十分有效(md5加密长度32位)
                    a.setState("enable");
                else
                    a.setState("disable");
                a.setPassword("");//保护密码安全
            }
            pageInfo.setList(adminList);
        }
        else{
            pageInfo = new PageInfo<>();
        }
        return pageInfo;
    }

    private Admin adminPwdInit(Admin admin){//获取管理员的默认密码
        if(admin == null) return null;
        StringBuilder newPwd = new StringBuilder();//默认密码:管理员id重复输入至18位
        for(int i = 0;i < 18;i++){//id最少一位，循环18次保证最少18位
            newPwd.append(admin.getAdminId());
        }
        String pwd = String.valueOf(newPwd).substring(0,18);//无论结果如何，只截取18位
        admin.setPassword(DigestUtils.md5DigestAsHex(pwd.getBytes()));//对密码进行md5加密
        return admin;
    }

    private boolean superAdminKeyCheck(String superAdminKey){//超级管理员密码校验(id是已知的，故仅校验密码)
        Admin superAdmin = new Admin();
        superAdmin.setAdminId(0);
        superAdmin.setPassword(superAdminKey);
        return superAdminCheck(superAdmin);
    }

    private boolean superAdminCheck(Admin input){//超级管理员校验
        Admin admin = adminMapper.selectByPrimaryKey(0);//获取超级管理员信息(superAdminId:0)
        if(input == null || admin == null)//获取不到输入或者获取不到超级管理员
            return false;
        if(input.getAdminId() != 0)//id不为超级管理员id
            return false;
        //id无误则返回密码校验的结果
        return PasswordCheck.checkUserKey(input.getPassword(), admin.getPassword());
    }
}
